<?php
/**
 * Core classe principal do framework
 * 
 * @author Cristiano M. Gomes <cmgomes.es@gmail.com>
 */
 Class Core
 {
 	/**
 	 * Propriedade Singleton do objeto
 	 *
 	 * @var Core
 	 */
 	private static $Instancia;
 	
	/**
	 * Identifica se o sistema está sendo acessado por um bot
	 */  	
 	private $Bot; 

 	/**
 	 * Adiciona um prefixo ao nome das tabelas geradas no sistema
 	 * @var string
 	 */
 	private $prefixo_tabela;
 	public function SetPrefixoTabela($pre){
 		$this->prefixo_tabela = $pre;
 	}
 	public function GetPrefixoTabela(){
 		return $this->prefixo_tabela;
 	}
 	
 	/**
 	 * Método Singleton do objeto
 	 *
 	 * @return Core
 	 */
 	public static function Instanciar(){
 		if(self::$Instancia){
 			return self::$Instancia;
 		}else{
 			self::$Instancia = new Core();
 			return self::$Instancia;
 		}
 	}
 	
 	/**
 	 * Construtor classe que inicia todo o sistema
 	 * 
 	 * @return 	void
 	 */
 	public function __construct($app = '')
 	{
		//----------------- Configurações iniciais
 		$this->Inicio = date('d/m/Y H:i:s');

		//----------------- Configuração do html;
		header("X-Powered-By: SofiaPHP");
		header('p3p: CP="CAO PSA OUR"'); 

		//-----------------	Definições básicas do sistema
		define ("windows", preg_match("/^[a-zA-Z]:/", __FILE__));
		define ("ajax", isset($_SERVER["HTTP_X_REQUESTED_WITH"]));
		define ("post", $_SERVER["REQUEST_METHOD"] == "POST");
		//define ("mobile", is_mobile());
		//$this->Bot = $this->e_bot();
		//$this->RegistraIndex();

 	}

	/**
	 * Função que inicializa o controle indicado e chama o método apropriado,
	 * O método pode ser recebido via parametro action e caso não seja recebido nenhum então o método MontaTela é chamado 
	 */  	
 	public function Start(){
 		
		//$Sistema = Sistema::GetInstancia();
		$Sistema = new Sistema;

		$Sistema->TrataUrl();

		if($Sistema->ValidaPagina()){

			$tmp_param = $Sistema->GetParametros();
			$App = Aplicacao::Instanciar();
			$tmp_controle = ucfirst($Sistema->GetControleBase());

			$Control = new $tmp_controle($Sistema, $this, $App);
			$Control->Init();
			$Control->ConfiguraModelo();

			$plugins = $Control->GetPlugins();
			foreach($plugins as $plugin){
				$plug = new $plugin($Control);
				$plug->executar();
				$Control = $plug->GetControle();
			}

			$action = $Sistema->GetParametros('action');
            $Render = new SofiaUi();

			if($action){
				$Control->$action();
			}

			//$Control->Conteudo($Render->CarregaHtml($Sistema->GetPaginaAtual()->Arquivo() ));
			$Control->MostraTela();
			$Control->Finaliza();
			$Render->RegistraControlador($Control)->Ajustar();

			if($Control->NomeModelo()){
				if($Control->Persistencia()){
					$Render->ConfiguraTelaPorModelo($Control);
				}
			}

			//$Render->ConfiguraMensagem();
			//$Render->Show();
			$Render->display($Sistema->GetPaginaAtual()->Arquivo());

		}else{
			echo $Sistema->GetControleBase() . '<br />';
			echo 'Página não encontrada.';
		}
	}

 	/**
	* E_BOT Verfica se é requerimento de algum mecanismo de busca
 	* Esta função ainda não esta totalmente implementada.	
	* 
	* @ignore Função ainda não pronta para implementação
	* @return	boolean
	* @access 	private
	*/
	private function e_bot()
	{
		$ua = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
		$ip = $_SERVER['REMOTE_ADDR'];
		
		return $ip == 'local' 	|| strpos($ua, 'googlebot') !== false		|| strpos($ua, 'mediapartners') !== false 
							|| strpos($ua, 'yahooysmcm') !== false		|| strpos($ua, 'baiduspider') !== false
							|| strpos($ua, 'msnbot') !== false			|| strpos($ua, 'slurp') !== false
							|| strpos($ua, 'ask') !== false				|| strpos($ua, 'teoma') !== false
							|| strpos($ua, 'spider') !== false 			|| strpos($ua, 'heritrix') !== false 
							|| strpos($ua, 'attentio') !== false 		|| strpos($ua, 'twiceler') !== false 
							|| strpos($ua, 'irlbot') !== false 			|| strpos($ua, 'fast crawler') !== false     
							|| strpos($ua, 'fastmobilecrawl') !== false || strpos($ua, 'jumpbot') !== false
							|| strpos($ua, 'yahooseeker') !== false		|| strpos($ua, 'googlebot-mobile') !== false
							|| strpos($ua, 'motionbot') !== false		|| strpos($ua, 'mediobot') !== false
							|| strpos($ua, 'chtml generic') !== false;

	}
	
	/**
	 * Avisa ao administrador por email quando algum bot indexar a página
	 */
	private function RegistraIndex(){
		if($this->Bot != 'local'){
			if(eregi($this->Bot, $_SERVER['HTTP_USER_AGENT'])){
				@mail($this->AdminEmail(), 'Foi detectado acesso de bot no site: ' . $SERVER_NAME, $this->Inicio . ' - ' . $this->Bot . 'pagina; ' . $_SERVER['SERVER_NAME'] . ROOT_VIRTUAL);
			}
		}
	}

	/**
	 * Cria tabelas no banco de dados utilizando as classes Modelos listadas no array
	 *
	 * @param array $modelos
	 * @return void
	 */
	public function CriarTabelas($modelos){
		$dao = Dao::Instanciar();
		$dao->Conectar();
		$dao->criar_tabela($modelos);
		
		echo "Tabelas Cadastradas:<br />";
		foreach($modelos as $m){
			echo "- $m; <br />";
		}
		echo "Favor comentar o algorítmo de inserção de tabelas no arquivo index.php.";
		die();
	}
 }